using UnityEngine;
using System.Collections;

/// <summary>
/// 多路径点浮动平台控制器
/// 实现功能：
/// - 平台在多个路径点之间移动
/// - 每个点可以停顿一段时间
/// - 支持折返移动或循环路径
/// - 玩家站上后跟随平台移动（通过 SetParent）
/// </summary>
public class FloatingPlatformPath_20250422 : MonoBehaviour
{
    [Header("路径点设置")]
    public Transform[] waypoints;               // 所有路径点（按顺序移动）

    [Header("移动参数")]
    public float moveSpeed = 2f;                // 平台移动速度（单位/秒）
    public float waitTimeAtPoint = 1f;          // 到达路径点后等待的时间（秒）
    public bool loop = false;                   // 是否为循环路径（否则为折返）

    // 状态变量
    private int currentIndex = 0;               // 当前目标路径点索引
    private bool isWaiting = false;             // 是否处于等待状态
    private bool isReversing = false;           // 当前是否处于折返状态
    private Coroutine waitCoroutine;            // 防止重复协程
    private const float arrivalThreshold = 0.01f; // 抵达目标点的最小距离容差（避免浮点误差）

    private void Start()
    {
        // ✅ 至少需要两个路径点
        if (waypoints == null || waypoints.Length < 2)
        {
            Debug.LogError("请为平台设置至少两个路径点。");
            enabled = false;
            return;
        }
    }

    private void FixedUpdate()
    {
        // ✅ 如果正在等待或路径无效则跳出
        if (isWaiting || waypoints.Length < 2) return;

        // ✅ 获取当前目标路径点
        Transform targetPoint = waypoints[currentIndex];

        // ✅ 平滑移动到目标点
        transform.position = Vector3.MoveTowards(
            transform.position,
            targetPoint.position,
            moveSpeed * Time.fixedDeltaTime
        );

        // ✅ 到达目标路径点，开始等待并准备切换下一个点
        if (Vector3.Distance(transform.position, targetPoint.position) < arrivalThreshold && waitCoroutine == null)
        {
            waitCoroutine = StartCoroutine(WaitAndSwitchPoint());
        }
    }

    /// <summary>
    /// 等待一段时间后切换下一个路径点（支持循环或折返逻辑）
    /// </summary>
    private IEnumerator WaitAndSwitchPoint()
    {
        isWaiting = true;
        yield return new WaitForSeconds(waitTimeAtPoint);

        if (loop)
        {
            // ✅ 循环移动
            currentIndex = (currentIndex + 1) % waypoints.Length;
        }
        else
        {
            // ✅ 折返逻辑
            if (!isReversing)
            {
                currentIndex++;
                if (currentIndex >= waypoints.Length)
                {
                    currentIndex = waypoints.Length - 2;
                    isReversing = true;
                }
            }
            else
            {
                currentIndex--;
                if (currentIndex < 0)
                {
                    currentIndex = 1;
                    isReversing = false;
                }
            }
        }

        isWaiting = false;
        waitCoroutine = null;
    }

    // ✅ 玩家踩上平台时，设置为平台子对象，跟随移动
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            if (collision.transform.parent != transform)
            {
                collision.transform.SetParent(transform);
            }
        }
    }

    // ✅ 玩家离开平台时，解除父子关系
    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            collision.transform.SetParent(null);
        }
    }

    // ✅ 编辑器中可视化路径
    private void OnDrawGizmos()
    {
        if (waypoints == null || waypoints.Length < 2) return;

        Gizmos.color = Color.yellow;

        // ✅ 绘制路径线段
        for (int i = 0; i < waypoints.Length - 1; i++)
        {
            Gizmos.DrawLine(waypoints[i].position, waypoints[i + 1].position);
        }

        // ✅ 如果是闭环，连接最后一个点和第一个点
        if (loop)
        {
            Gizmos.DrawLine(waypoints[waypoints.Length - 1].position, waypoints[0].position);
        }
    }
}
